Rsync 全球产线同步至中国产线
任务描述
全球产线的文件存储在一天之内同步至中国产线
背景
- 全球产线中 90%以上的文件,中国产线已有,文件名和文件大小但是 时间戳不一样
- 全球产线中到中国产线的网速只有 700k/s
- 目前全球产线 中数据 2T
- 7*24 服务不可中断
解决方案
Rsync 介绍
rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remote sync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。
在同步备份时,默认情况下,rsync通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。
数据初始化
方案一:全量初始化
因网速限制,传输 2T 的数据需要几十天时间,故否掉$
方案二:更新现有文件元数据
什么样的文件不需要更新
- default:源目录和目标目录中,跳过文件名,文件大小,文件 更新时间的文件. 执行时间:27 分钟
- --ignore-times: 源目录和目标目录中,不跳过那些有同样的时间和大小的文件
- --size-only: 源目录和目标目录中,只跳过大小相同的文件(文件名,文件大小)。执行时间:7 分钟
- checksum: 根据 checksum 计算文件是否相同。执行时间:3 小时+
综合考虑安全性和速度,default 模式最适合,故需要更新中国产线时间戳与全球一样
故需要把根据现有文件的文件名和文件大小更新为相同时间戳
rsync -a --size-only --progress --existing --rsync-path="sudo rsync" --exclude ".*/" /repo.xxxx/xxxxprod/centos7/ rsync@10.254.162.xxx:/repo.xxx/xxxxprod/centos7/
- --existing: 仅仅更新那些已经存在于 DST 的文件,而不备份那些新创建的文件
- -a: archive 模式,即在 DST 的文件保留与 SRC 上的文件的元数据(含时间戳)
- --progress: 展示传输过程
- --exclude: 不同步某些文件
- --rsync-path:指定远程服务器上的rsync命令所在路径信息。(specify the rsync to run on remote machine)
定时任务同步
基本命令
rsync -aHAXxv --numeric-ids --update --progress --rsync-path="sudo rsync" --exclude ".*/" /repo.xxx/xxxxprod/centos7/ rsync@10.254.162.xxx:/repo.xxx/xxxxprod/centos7/
- H: 保留硬链接
- A: 保留 ACLs
- X: 保留外部属性
- x: 不跨越文件系统的边界(don't cross file-system boundaries)
- v: 打印详细记录
- --numeric-ids: 不要按用户/组名映射 uid/gid 值(don't map uid/gid values by user/group name_
- --update: 如果 DST 的 文件更新,则跳过 (skip files that are newer on the receiver)
性能提升
rsync -aHAXxv --numeric-ids --update --progress --rsync-path="sudo rsync" --exclude ".*/" -e "ssh -T -c arcfour -o Compression=no -x" /repo.xxx/xxxxprod/centos7/ rsync@10.254.162.254:/repo.xxx/xxxxprod/centos7/
- e: 指定使用rsh,ssh方式进行数据同步
ssh
- T: 禁止分配伪终端(turn off pseudo-tty to decrease cpu load on destination.)
- c arcfour: 用最弱但是最快的加密算法arcfour,需服务器端支持
- o Compression=no: 关闭SSH压缩(Turn off SSH compression.)
- x: 禁用X11图形界面转发(turn off X forwarding if it is on by default.)
自动重传
#!/bin/bash
while [ 1 ]
do
rsync -avz --partial source dest
if [ "$?" = "0" ] ; then
echo "rsync completed normally"
exit
else
echo "Rsync failure. Backing off and retrying..."
sleep 180
fi
done
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。